package com.gitee.qdbp.general.common.api.reusable.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.base.annotation.DataIsolation;
import com.gitee.qdbp.base.annotation.OperateTraces;
import com.gitee.qdbp.base.enums.DataState;
import com.gitee.qdbp.general.common.enums.UsingState;

/**
 * 基础树形数据实体类
 *
 * @author zhh
 * @version 180514
 */
@OperateTraces(id = "id", code = "nodeCode", desc = "nodeText")
@DataIsolation("tenantCode")
public class SimpleTreeBean implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 表名 **/
    public static final String TABLE = "gn_simple_tree_info";

    /** 主键 **/
    private String id;

    /** 租户编号 **/
    private String tenantCode;

    /** 使用场景 **/
    private String sceneType;

    /** 节点编号 **/
    private String nodeCode;

    /** 节点名称 **/
    private String nodeText;

    /** 上级编号 **/
    private String parentCode;

    /** 排序号(越小越靠前) **/
    private Integer sortIndex;

    /** 级数(从1开始) **/
    private Integer levelIndex;

    /** 是否叶子节点 **/
    private Boolean leaf;

    /** 创建人ID **/
    private String creatorId;

    /** 创建时间 **/
    private Date createTime;

    /** 选项 **/
    private SimpleTreeOptions options;

    /** 启用状态(1.正常|2.未启用) **/
    private UsingState usingState;

    /** 数据状态:0为正常|其他为删除 **/
    private DataState dataState;

    /** 获取主键 **/
    public String getId() {
        return id;
    }

    /** 设置主键 **/
    public void setId(String id) {
        this.id = id;
    }

    /** 获取租户编号 **/
    public String getTenantCode() {
        return tenantCode;
    }

    /** 设置租户编号 **/
    public void setTenantCode(String tenantCode) {
        this.tenantCode = tenantCode;
    }

    /** 获取使用场景 **/
    public String getSceneType() {
        return sceneType;
    }

    /** 设置使用场景 **/
    public void setSceneType(String sceneType) {
        this.sceneType = sceneType;
    }

    /** 获取节点编号 **/
    public String getNodeCode() {
        return nodeCode;
    }

    /** 设置节点编号 **/
    public void setNodeCode(String nodeCode) {
        this.nodeCode = nodeCode;
    }

    /** 获取节点名称 **/
    public String getNodeText() {
        return nodeText;
    }

    /** 设置节点名称 **/
    public void setNodeText(String nodeText) {
        this.nodeText = nodeText;
    }

    /** 获取上级编号 **/
    public String getParentCode() {
        return parentCode;
    }

    /** 设置上级编号 **/
    public void setParentCode(String parentCode) {
        this.parentCode = parentCode;
    }

    /** 获取排序号(越小越靠前) **/
    public Integer getSortIndex() {
        return sortIndex;
    }

    /** 设置排序号(越小越靠前) **/
    public void setSortIndex(Integer sortIndex) {
        this.sortIndex = sortIndex;
    }

    /** 获取级数(从1开始) **/
    public Integer getLevelIndex() {
        return levelIndex;
    }

    /** 设置级数(从1开始) **/
    public void setLevelIndex(Integer levelIndex) {
        this.levelIndex = levelIndex;
    }

    /** 获取是否叶子节点 **/
    public Boolean getLeaf() {
        return leaf;
    }

    /** 设置是否叶子节点 **/
    public void setLeaf(Boolean leaf) {
        this.leaf = leaf;
    }

    /** 获取创建人ID **/
    public String getCreatorId() {
        return creatorId;
    }

    /** 设置创建人ID **/
    public void setCreatorId(String creatorId) {
        this.creatorId = creatorId;
    }

    /** 获取创建时间 **/
    public Date getCreateTime() {
        return createTime;
    }

    /** 设置创建时间 **/
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /** 获取选项 **/
    public SimpleTreeOptions getOptions() {
        return options;
    }

    /** 获取选项, force=是否强制返回非空对象 **/
    public SimpleTreeOptions getOptions(boolean force) {
        if (options == null && force) {
            options = new SimpleTreeOptions();
        }
        return options;
    }

    /** 设置选项 **/
    public void setOptions(SimpleTreeOptions options) {
        this.options = options;
    }

    /** 获取启用状态(1.正常|2.未启用) **/
    public UsingState getUsingState() {
        return usingState;
    }

    /** 设置启用状态(1.正常|2.未启用) **/
    public void setUsingState(UsingState usingState) {
        this.usingState = usingState;
    }

    /** 获取数据状态:0为正常|其他为删除 **/
    public DataState getDataState() {
        return dataState;
    }

    /** 设置数据状态:0为正常|其他为删除 **/
    public void setDataState(DataState dataState) {
        this.dataState = dataState;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends SimpleTreeBean> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setId(this.getId()); // 主键
        instance.setTenantCode(this.getTenantCode()); // 租户编号
        instance.setSceneType(this.getSceneType()); // 使用场景
        instance.setNodeCode(this.getNodeCode()); // 节点编号
        instance.setNodeText(this.getNodeText()); // 节点名称
        instance.setParentCode(this.getParentCode()); // 上级编号
        instance.setSortIndex(this.getSortIndex()); // 排序号(越小越靠前)
        instance.setLevelIndex(this.getLevelIndex()); // 级数(从1开始)
        instance.setLeaf(this.getLeaf()); // 是否叶子节点
        instance.setCreatorId(this.getCreatorId()); // 创建人ID
        instance.setCreateTime(this.getCreateTime()); // 创建时间
        instance.setOptions(this.getOptions()); // 选项
        instance.setUsingState(this.getUsingState()); // 启用状态(1.正常|2.未启用)
        instance.setDataState(this.getDataState()); // 数据状态:0为正常|其他为删除
        return instance;
    }

    /**
     * 将SimpleTreeBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> SimpleTreeBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends SimpleTreeBean, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (SimpleTreeBean bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }

}